import { ValidatorFn, AbstractControl, FormGroup, FormControl } from "@angular/forms";
import { StringKit } from "../../../cmnjs/StringKit";

/**
 * 扩展的验证器。
 * 
 * TODO 验证错误之后，消息没有显示成红色。
 * TODO 修改成 i18n 的消息
 */
export class ValidationKit {

  /**
   * 必须输入检查。
   */
  static required(controlName: string): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } => {
      const value = control.value;
      if (value == null || value.length === 0) {
        return ValidationKit.validationError("请输入" + controlName + "。");
      }

      return null;
    };
  }

  static ALPHABET = new RegExp("[A-Z]+");

  /**
   * 半角英文字符。
   */
  static alphabet(controlName: string): ValidatorFn {
    return (control: AbstractControl): { [key: string]: any } => {
      const value = control.value;
      if (StringKit.isEmpty(value)) {
        return null;
      }

      if (ValidationKit.ALPHABET.test(value)) {
        return ValidationKit.validationError(controlName + "中请输入半角英文字符。");
      }

      return null;
    };
  }

  /**
   * 半角英数字等字符。
   */
  static alphabetNumeric(controlName: string): ValidatorFn {
    return null;
  }

  /**
   * 半角英数记号等字符。
   */
  static alphabetNumericSymbol(controlName: string): ValidatorFn {
    return null;
  }

  /**
   * 布尔值。
   */
  static booleanValue(controlName: string): ValidatorFn {
    return null;
  }

  /**
   * 组装验证错误对象。
   * 
   * @param msg 消息内容
   */
  static validationError(msg: string) {
    return {
      'error': { 'message': msg }
    };
  }

  /**
   * 取得验证消息。
   * 
   * @param forms Form组，包含控件对象
   * @param controlName 控件名称
   */
  static getValidationMessage(forms: FormGroup, controlName: string): string {
    console.log(controlName);

    let error = forms.controls[controlName].errors;
    if (error instanceof Array) {
      error = error[0];
    }
    if (!error) {
      return "";
    }

    return error.error ? error.error.message : error;
  }

    /**
   * 取得验证消息。
   * 
   * @param forms Form组，包含控件对象
   * @param controlName 控件名称
   */
  static getValidationMessageFromControl(control: FormControl): string {
    let error = control.errors;
    if (error instanceof Array) {
      error = error[0];
    }
    if (!error) {
      return "";
    }

    return error.error ? error.error.message : error;
  }
}